package demo29;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * ConcurrentLinkedQueue底层不是加锁的实现，而是使用 CAS 原子指令来处理对数据的并发访问，非阻塞式，效率高很多
 */
public class TicketSeller4 {
    static Queue<String> tickets = new ConcurrentLinkedQueue<>();
    static {
        for (int i=0; i<1000; i++) {
            System.out.println("票编号：" + i );
        }
    }

    public static void main(String[] args) {
        for (int i=0; i<10; i++) {
            new Thread( ()-> {
                while(true) {
                    String str = tickets.poll(); //poll方法是原子性的，拿出一张票
                    //这里的判断和操作不是原子性的，但是也不会有线程安全问题，因为没有对queue做任何修改操作
                    if(str == null) break; //先poll，再判断tickets是不是空的，最后没有任何操作，所以不用加锁也不会出现任何问题
                    else System.out.println("销售了.." + str);
                }
            }).start();
        }
    }
}